iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Modern Web

Phoenix 1.7 完全教學系列 第 28

28 LiveView 測試

  • 分享至 

  • xImage
  •  

由於 LiveView 的狀態是在 server 端,所以大部分的 End-to-end 測試都可以直接使用 Elixir 在 LiveViewTest 中進行

LiveViewTest module 提供了很多操作 LiveView 測試的函式。

基本的 Index 畫面測試

與 Controll-View 類似,我們用 live 執行 LiveView,並且檢查回傳的 html 是否包含我們要的內容。

defmodule GratitudeWeb.NoteLiveTest do
  use GratitudeWeb.ConnCase

  alias Gratitude.Notes
  import Phoenix.LiveViewTest

  describe "Index" do
    test "lists all notes", %{conn: conn} do
      {:ok, note} = Notes.create_note(%{content: "感激筆記內容"})
      {:ok, _view, html} = live(conn, ~p"/")

      assert html =~ "感激筆記 LiveView 版"
      assert html =~ note.content
    end
  end
end

live 函示除了靜態的 html 之外還有回傳測試用的 view struct ,可以讓我們在測試中對目前的 LiveView process 操作。

測試新增 Note

test "saves new note", %{conn: conn} do
  {:ok, view, _html} = live(conn, ~p"/")

  assert view
         |> element("a", "新增筆記")
         |> render_click() =~ "新增感激筆記"

  assert_patch(view, ~p"/new")

  assert view
         |> form("#note-form", note: %{"content" => "新筆記"})
         |> render_submit()

  assert_patch(view, ~p"/")

  html = render(view)
  assert html =~ "新增成功"
  assert html =~ "新筆記"
end

我們使用一連串的 assert 檢查 LiveView 的狀態,並且使用 render_clickrender_submit 模擬使用者點擊與送出表單的動作。

  1. 點擊新增筆記連結:

先使用 element 找到 view 中的新增元件,再使用 render_click 點擊,最後在使用 =~ 檢查回傳的 html 是否包含我們要的內容。

  1. 確認 patch 到新筆記頁面:

使用 assert_patch 檢查是否有 patch 到新筆記頁面。

  1. 填寫表單並送出:

使用 form 找到表單,並且填入 note 的內容,再使用 render_submit 送出表單。

  1. 確認 patch 回列表頁面:

一樣使用 assert_patch 檢查是否有 patch 回列表頁面。

  1. 回到列表頁面後,檢查回傳的 html 是否包含新增的內容:

view 使用 render ,並檢查回傳的內容。

關於 View

通常寫 Elixir 的時候,由於是函數式的寫法,並不會有隱藏的狀態,但在寫 LiveView 測試的時候要注意,這邊用的 view 會指到正在執行 LiveView 頁面的 process,他有自己的狀態。
所以在我們執行 render_clickrender_submit 的時候,儘管這些函式不會回傳新的 view,但是會改變 view 畫面 的狀態。


上一篇
27 LiveComponent 表格 2
下一篇
29 LiveView_修改
系列文
Phoenix 1.7 完全教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言